﻿using System;
using System.Drawing;

namespace ERModelData
{
    /// <summary>Класс для визуализации сущности</summary>
    public class EssenceVisuality
    {
        /// <summary>Основной объект(прямоугольник)</summary>
        public Rectangle essenceObject;
        /// <summary>Маркеры связей</summary>
        public MarkersLink markersLinks;
        /// <summary>Конструктор класса</summary>
        /// <param name="Top">Позиция верхнего левого угла</param>
        /// <param name="Size">Размер прямоугольника</param>
        public EssenceVisuality(Point Top, Size Size)
        {
            essenceObject = new Rectangle(Top, Size);
            markersLinks = new MarkersLink(this);
        }
        /// <summary>Функция отрисовки сущности</summary>
        ///// <param name="g">Окно для визуализации</param>
        public void Draw(Graphics g, Essence inf)
        {
            if (inf.Important)
            {
                g.DrawRectangle(Config.cEssenceVisuality.BorderI, essenceObject);
                g.FillRectangle(Config.cEssenceVisuality.BGI, essenceObject);
            }
            else
            {
                g.DrawRectangle(Config.cEssenceVisuality.Border, essenceObject);
                g.FillRectangle(Config.cEssenceVisuality.BG, essenceObject);
            }
            RectangleF region = new RectangleF(essenceObject.Location, essenceObject.Size);
            region = DrawString(g, inf.Name, Config.cEssenceVisuality.Fonts.TitleFont, region);
            region = DrawString(g, "Атрибуты:", Config.cEssenceVisuality.Fonts.TitleAtributeFont, region);
            foreach (Atribute i in inf.Atributs)
                if (i.Key) region = DrawString(g, i.Name, Config.cEssenceVisuality.Fonts.AtributeIFont, region);
                else region = DrawString(g, i.Name, Config.cEssenceVisuality.Fonts.AtributeFont, region);
        }
        /// <summary>Функция отображения информации внутри сущности</summary>
        /// <param name="g">Рабочее окно</param>
        /// <param name="s">Отображаемая строка</param>
        /// <param name="f">Шрифт строки</param>
        /// <param name="region">Область в которую должна поместиться строка</param>
        /// <returns>Оставшееся место в области</returns>
        private RectangleF DrawString(Graphics g, string s, Font f, RectangleF region)
        {
            SizeF size = g.MeasureString(s, f);
            if (region.Height > 0)
            {
                g.DrawString(s, f, Brushes.Black, region, new StringFormat(StringFormatFlags.NoWrap));
                size.Width = 0;
                region.Location = PointF.Add(region.Location, size);
                region.Size = SizeF.Subtract(region.Size, size);
                return region;
            }
            return region;
        }
        /// <summary>Функция проверки попадения курсора в прямоугольник</summary>
        /// <param name="pos">Позиция курсора</param>
        /// <returns>ключ попадения</returns>
        public bool Check(Point pos)
        {
            Size size = new Size(3, 3);
            Point location = Point.Subtract(essenceObject.Location, size);
            size = Size.Add(essenceObject.Size, size);
            Rectangle r = new Rectangle(location, size);
            return r.Contains(pos);
        }
    }
}
